package com.divemotor.ventarepuestosinternet.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.apache.commons.collections.CollectionUtils;

import com.divemotor.ventarepuestosinternet.beans.ElementoCotizacion;
import com.divemotor.ventarepuestosinternet.beans.adapter.VehiculoAdapter;
import com.divemotor.ventarepuestosinternet.model.Cotizacion;
import com.divemotor.ventarepuestosinternet.model.ImagenRepuesto;
import com.divemotor.ventarepuestosinternet.model.ImagenRepuestoCotizacion;
import com.divemotor.ventarepuestosinternet.model.Promocion;
import com.divemotor.ventarepuestosinternet.model.PromocionCotizacion;
import com.divemotor.ventarepuestosinternet.util.Constantes;

@ManagedBean(name="carritoComprasSessionController")
@SessionScoped
public class CarritoComprasSessionController implements  Serializable {

	private static final long serialVersionUID = -1378914647487417517L;
	
	private List<ElementoCotizacion> 		listaElementosCotizacion;
	private Map<String, ElementoCotizacion> hmElementosCotizacion;
	
	public CarritoComprasSessionController() {
		listaElementosCotizacion = new ArrayList<ElementoCotizacion>();
		hmElementosCotizacion    = new HashMap<String, ElementoCotizacion>();
	}
	
	public ElementoCotizacion getElementoCotizacion(String codigo){
		return hmElementosCotizacion.get(codigo);
	}
	
	public void agregarElementoCotizacion(ElementoCotizacion elem){
		hmElementosCotizacion.put(elem.getCodigoElemento(), elem);
		listaElementosCotizacion.add(elem);
	}
	
	public void eliminarElementoCotizacion(String codigo){
		ElementoCotizacion elem = getElementoCotizacion(codigo);  
		eliminarElementoCotizacion(elem);
	}
	
	public void eliminarElementoCotizacion(ElementoCotizacion elem){
		listaElementosCotizacion.remove(elem);
		hmElementosCotizacion.remove(elem.getCodigoElemento());
	}
	
	public ElementoCotizacion getElementoCotizacionRepuesto(Integer idImagenRepuesto){
		return getElementoCotizacion(Constantes.PREFIJO_IMG_REPU + idImagenRepuesto);
	}
	
	public ElementoCotizacion getElementoCotizacionPromocion(Integer idPromocion){
		return getElementoCotizacion(Constantes.PREFIJO_PROMO + idPromocion);
	}
	
	public boolean agregarElementoCotizacionPromocion(Promocion promocion){
		Integer idPromocion     = promocion.getIdPromocion();
		ElementoCotizacion elem = getElementoCotizacionPromocion(idPromocion);
		boolean resultado       = true;
		
		if(elem != null){
			resultado			= false;
			elem.setCantidad(elem.getCantidad() + promocion.getCantidad());
		}else{
			ElementoCotizacion elementoCotizacion = new ElementoCotizacion();
			elementoCotizacion.setPromocion(promocion);
			elementoCotizacion.setCantidad(promocion.getCantidad());
			elementoCotizacion.setCodigoElemento(Constantes.PREFIJO_PROMO + idPromocion);
			agregarElementoCotizacion(elementoCotizacion);
		}
		
		return resultado;
	}
	
	public boolean agregarElementoCotizacionImagenRepuesto(ImagenRepuesto imagenRepuesto){
		Integer idImagenRepuesto = imagenRepuesto.getIdImagenRepuesto();
		ElementoCotizacion elem  = getElementoCotizacionRepuesto(idImagenRepuesto);
		boolean resultado        = true;
		
		if(elem != null){
			resultado			= false;
			elem.setCantidad(elem.getCantidad() + imagenRepuesto.getCantidad());
		}else{
			ElementoCotizacion elementoCotizacion = new ElementoCotizacion();
			VehiculoAdapter vehiculoAdapter = imagenRepuesto.getVehiculoAdapter();
			elementoCotizacion.setImagenRepuesto(imagenRepuesto);
			elementoCotizacion.setCantidad(imagenRepuesto.getCantidad());
			elementoCotizacion.setMarca(vehiculoAdapter.getMarca());
			elementoCotizacion.setModelo(vehiculoAdapter.getModelo());
			elementoCotizacion.setTipoVehiculo(vehiculoAdapter.getTipoVehiculo());
			elementoCotizacion.setChasis(vehiculoAdapter.getChasis());
			elementoCotizacion.setPlaca(vehiculoAdapter.getPlaca());
			elementoCotizacion.setTipo(vehiculoAdapter.getTipo());
			elementoCotizacion.setIdVehiculoExtra(vehiculoAdapter.getIdVehiculoExtra());
			
			elementoCotizacion.setCodigoElemento(Constantes.PREFIJO_IMG_REPU + idImagenRepuesto);
			agregarElementoCotizacion(elementoCotizacion);
		}
		
		return resultado;
	}
	
	public void eliminarElementocotizacionPromocion(Promocion promocion){
		eliminarElementoCotizacion(Constantes.PREFIJO_PROMO + promocion.getIdPromocion());
	}
	
	public void eliminarElementocotizacionPromocion(ImagenRepuesto imagenRepuesto){
		eliminarElementoCotizacion(Constantes.PREFIJO_IMG_REPU + imagenRepuesto.getIdImagenRepuesto());
	}
	
	public Cotizacion generarSolicitud(){
		
		List<ImagenRepuestoCotizacion> listaImagenRepuestoCotizaciones = null;
		List<PromocionCotizacion> 	   listaPromocionCotizaciones	   = null;
		
		if(!isEmpty()){
		
			listaImagenRepuestoCotizaciones = new ArrayList<ImagenRepuestoCotizacion>();
			listaPromocionCotizaciones 	    = new ArrayList<PromocionCotizacion>();
			
			for (ElementoCotizacion elementoCotizacion : listaElementosCotizacion) {
				if (elementoCotizacion.getPromocion() != null) {
					PromocionCotizacion promocionCotizacion = new PromocionCotizacion();
					promocionCotizacion.setPromocion(elementoCotizacion.getPromocion());
					promocionCotizacion.setCantidad(elementoCotizacion.getCantidad());
					listaPromocionCotizaciones.add(promocionCotizacion);
				} else {
					ImagenRepuestoCotizacion imagenRepuestoCotizacion = new ImagenRepuestoCotizacion();
					imagenRepuestoCotizacion.setImagenRepuesto(elementoCotizacion.getImagenRepuesto());
					imagenRepuestoCotizacion.setCantidad(elementoCotizacion.getCantidad());
					imagenRepuestoCotizacion.setChasis(elementoCotizacion.getChasis());
					imagenRepuestoCotizacion.setPlaca(elementoCotizacion.getPlaca());
					imagenRepuestoCotizacion.setMarca(elementoCotizacion.getMarca());
					imagenRepuestoCotizacion.setModelo(elementoCotizacion.getModelo());
					imagenRepuestoCotizacion.setTipoVehiculo(elementoCotizacion.getTipoVehiculo());
					imagenRepuestoCotizacion.setTipo(elementoCotizacion.getTipo());
					listaImagenRepuestoCotizaciones.add(imagenRepuestoCotizacion);
				}
			}
		}
		
		Cotizacion cotizacion = new Cotizacion();
		cotizacion.setListaImagenRepuestoCotizaciones(listaImagenRepuestoCotizaciones);
		cotizacion.setListaPromocionCotizaciones(listaPromocionCotizaciones);
		
		return cotizacion;
	}
	
	public void resetearColecciones(){
		listaElementosCotizacion.clear();
		hmElementosCotizacion.clear();
	}
	
	public boolean isEmpty(){
		return CollectionUtils.isEmpty(listaElementosCotizacion);
	}
	
	public List<ElementoCotizacion> getListaElementosCotizacion() {
		return listaElementosCotizacion;
	}

	public void setListaElementosCotizacion(List<ElementoCotizacion> listaElementosCotizacion) {
		this.listaElementosCotizacion = listaElementosCotizacion;
	}

	public Map<String, ElementoCotizacion> getHmElementosCotizacion() {
		return hmElementosCotizacion;
	}

	public void setHmElementosCotizacion(Map<String, ElementoCotizacion> hmElementosCotizacion) {
		this.hmElementosCotizacion = hmElementosCotizacion;
	}
	
}
